React useFormStatus asynkron validering: Asynkrona uppdateringar av formulÀrstatus | MLOG | MLOG

I detta exempel:

Förklaring

`useFormStatus`-hooken ger information om den senaste formulÀrinskickningen. Specifikt Àr `pending`-egenskapen en boolean som indikerar om formulÀret för nÀrvarande skickas. `data`-egenskapen, om tillgÀnglig, innehÄller formulÀrdata. `action`-egenskapen returnerar funktionen som anvÀnds som formulÀrets action.

Avancerade tekniker och bÀsta praxis

1. Debouncing för förbÀttrad prestanda

I scenarier dÀr anvÀndare skriver snabbt, som vid validering av anvÀndarnamn eller e-post, kan det vara ineffektivt och potentiellt överbelasta din server att utlösa ett API-anrop vid varje tangenttryckning. Debouncing Àr en teknik för att begrÀnsa hur ofta en funktion anropas. Implementera en debouncing-funktion för att fördröja valideringen tills anvÀndaren har slutat skriva under en angiven period.

            import React, { useState, useCallback, useTransition } from 'react';
import { useFormStatus } from 'react-dom';

function UsernameForm() {
  const [username, setUsername] = useState('');
  const [isPending, startTransition] = useTransition();

  // Debounce function
  const debounce = (func, delay) => {
    let timeoutId;
    return (...args) => {
      clearTimeout(timeoutId);
      timeoutId = setTimeout(() => {
        func(...args);
      }, delay);
    };
  };

  const debouncedHandleSubmit = useCallback(
    debounce(async (formData) => {
      "use server";
      const username = formData.get('username');

      // Simulate an API call to check username availability
      await new Promise(resolve => setTimeout(resolve, 500)); // Simulate network latency

      const isAvailable = username !== 'taken'; // Mock availability check

      if (!isAvailable) {
        throw new Error('Username is already taken.');
      }

      console.log('Username is available!');
      // Perform actual form submission here
    }, 500), // 500ms delay
    []
  );

  return (
    <form action={debouncedHandleSubmit}>
      <label htmlFor="username">Username:</label>
      <input
        type="text"
        id="username"
        name="username"
        value={username}
        onChange={(e) => setUsername(e.target.value)}
      />
      <button type="submit" disabled={isPending}>
        {isPending ? 'Checking...' : 'Submit'}
      </button>
       <StatusComponent />
    </form>
  );
}

function StatusComponent() {
    const { pending, data, method, action } = useFormStatus();

    return (
        <p>
          {pending && "Submitting..."}
          {data && <pre>{JSON.stringify(data)}</pre>}
        </p>
    )
}

export default UsernameForm;

            

I detta förbÀttrade exempel:

2. Throttling för frekvensbegrÀnsning

Medan debouncing förhindrar överdrivna API-anrop under en kort period, sÀkerstÀller throttling att en funktion anropas med ett regelbundet intervall. Detta kan vara anvÀndbart nÀr du behöver utföra viss validering regelbundet, men inte vill överbelasta din server. Till exempel att begrÀnsa frekvensen av API-anrop per minut.

3. Optimistiska uppdateringar

Optimistiska uppdateringar förbÀttrar anvÀndarupplevelsen genom att omedelbart uppdatera grÀnssnittet som om formulÀrinskickningen lyckades, redan innan servern bekrÀftar det. Detta skapar en upplevd snabbare svarstid. Det Àr dock avgörande att hantera potentiella fel pÄ ett smidigt sÀtt. Om valideringen pÄ serversidan misslyckas, ÄterstÀll grÀnssnittet till sitt tidigare tillstÄnd och visa ett felmeddelande.

4. Felhantering och feedback till anvÀndaren

Ge tydliga och informativa felmeddelanden till anvĂ€ndaren nĂ€r valideringen misslyckas. Ange vilket/vilka fĂ€lt som orsakade felet och föreslĂ„ korrigerande Ă„tgĂ€rder. ÖvervĂ€g att visa felmeddelanden inline, nĂ€ra de relevanta inmatningsfĂ€lten, för bĂ€ttre synlighet.

5. TillgÀnglighetsaspekter

Se till att dina formulÀr Àr tillgÀngliga för anvÀndare med funktionsnedsÀttningar. AnvÀnd lÀmpliga ARIA-attribut för att ge semantisk information om formulÀrelement och deras tillstÄnd. AnvÀnd till exempel aria-invalid för att indikera ogiltiga inmatningsfÀlt och aria-describedby för att associera felmeddelanden med motsvarande fÀlt.

6. Internationalisering (i18n)

NÀr du utvecklar formulÀr för en global publik, övervÀg internationalisering. AnvÀnd ett bibliotek som i18next eller React Intl för att tillhandahÄlla översatta felmeddelanden och anpassa formulÀrlayouten till olika sprÄk och kulturella konventioner. Till exempel varierar datumformat och adressfÀlt mellan lÀnder.

7. BÀsta praxis för sÀkerhet

Utför alltid validering pÄ serversidan utöver validering pÄ klientsidan. Validering pÄ klientsidan Àr frÀmst för anvÀndarupplevelsen och kan kringgÄs. Validering pÄ serversidan skyddar din applikation frÄn skadlig inmatning och sÀkerstÀller dataintegritet. Sanera anvÀndarinmatning för att förhindra cross-site scripting (XSS)-attacker och andra sÀkerhetssÄrbarheter. AnvÀnd ocksÄ en Content Security Policy (CSP) för att skydda mot XSS-attacker.

8. Hantering av olika metoder för formulÀrinskickning

useFormStatus-hooken fungerar bra med bÄde GET- och POST-metoder. Egenskapen `method` i det returnerade objektet kommer att innehÄlla HTTP-metoden som anvÀndes för att skicka formulÀret. Se till att din logik pÄ serversidan hanterar bÄda metoderna pÄ lÀmpligt sÀtt. GET-förfrÄgningar anvÀnds vanligtvis för enkel datahÀmtning, medan POST-förfrÄgningar anvÀnds för att skapa eller modifiera data.

9. Integration med formulÀrbibliotek

Även om useFormStatus erbjuder en grundlĂ€ggande mekanism för att hantera statusen för formulĂ€rinskickningar, kan du integrera den med mer omfattande formulĂ€rbibliotek som Formik, React Hook Form eller Final Form. Dessa bibliotek erbjuder avancerade funktioner som hantering av formulĂ€rstatus, valideringsregler och felhantering pĂ„ fĂ€ltnivĂ„. AnvĂ€nd useFormStatus för att förbĂ€ttra anvĂ€ndarupplevelsen under asynkron validering inom dessa bibliotek.

10. Testning av asynkron validering

Skriv enhetstester för att verifiera att din asynkrona valideringslogik fungerar korrekt. Mocka API-anropen med hjÀlp av bibliotek som Jest och Mock Service Worker (MSW). Testa bÄde lyckade scenarier och felscenarier för att sÀkerstÀlla att ditt formulÀr hanterar alla fall smidigt. Testa Àven tillgÀnglighetsfunktionerna i dina formulÀr för att sÀkerstÀlla att de kan anvÀndas av personer med funktionsnedsÀttningar.

Verkliga exempel frÄn hela vÀrlden

LÄt oss undersöka hur asynkron validering anvÀnds i olika verkliga scenarier globalt:

Slutsats

Asynkron validering Àr en oumbÀrlig teknik för att skapa robusta och anvÀndarvÀnliga formulÀr i React. Genom att utnyttja useFormStatus, debouncing, throttling och andra avancerade tekniker kan du ge feedback i realtid till anvÀndare, förhindra fel och förbÀttra den övergripande upplevelsen av att skicka formulÀr. Kom ihÄg att prioritera tillgÀnglighet, sÀkerhet och internationalisering för att skapa formulÀr som Àr anvÀndbara för alla, överallt. Testa och övervaka kontinuerligt dina formulÀr för att sÀkerstÀlla att de möter de förÀnderliga behoven hos dina anvÀndare och kraven frÄn din applikation.